# 堆内存：存储的长期数据，但是存储数据的速度有点慢，但是存储数据的稳定性比较高。python 中存储一些计算后的结果，可变对象的数据
# 栈内存：临时存储的数据，存储的是函数内部的局部变量（变量名而不是变量的值）
# 常量区：python 中给我们维护了大量的常量的存储的方法
# 资源区：存储我们写的代码、和一些基本的资源数据

# 字符串
def str_func():
    """
    字符串对象是存储在常量区
    当我们新建一个字符串对象，并为其赋值的时候
    python 解释器会到常量区中先找一下，有没有这个字符串存在
    如果有，就将新的变量也指向同一个字符串
    如果没有，就新建一个
    :return:
    """

    param_1 = "baiyu"
    param_2 = "baiyu"
    print(id(param_1))
    print(id(param_2))


def str_func_2():
    """
    字符串对象被修改之后是在内存中重新被创建一份数据
    因此字符串不可以被修改
    不可变对象
    :return:
    """
    param = "baiyu"
    print(id(param))
    param = "zhangsan"
    print(id(param))


def str_func_3():
    """
    字符串的值如果是拼接的结果，我们在创建是不会对其进行一一校验的，即通过引号引起来的字符串被视为常量，需要被长期固化
    字符串的值数据逻辑上的拼接结果，python 会将拼接后的结果存储到堆内存中，堆内存的数据被认为是经常变化的
    :return:
    """
    param_1 = "hello"
    param_2 = "world"
    param_3 = "helloworld"
    param_4 = param_1 + param_2
    print(id(param_1))
    print(id(param_2))
    print(id(param_3))
    print(id(param_4))


def str_func_4():
    """
    常量区存储的字符串不会随着作用域的变化而变化
    :return:
    """
    param = "baiyu"
    print(id(param))

    def inner_func():
        param_1 = "baiyu"
        print(id(param_1))

    inner_func()


if __name__ == "__main__":
    # str_func()
    # str_func_2()
    # str_func_3()
    str_func_4()
